# 正常定义函数
def fun(x):
    s = x ** 2
    return s


print(fun(2))
print(fun, type(fun))

# 函数的简写
# lambda表达式（匿名函数）
f = lambda x: x ** 2

print(f, type(f))
print(f(100))

# lambda表达式的应用
sum_score = [
    ("张三", 200),
    ("李四", 123),
    ("王五", 324),
    ("赵六", 345),
    ("江川", 123)
]

# key:需要一个函数作为参数，函数的作用是从列中取需要排序的列
# t:代表的是sum_score中的每一行
sum_score.sort(key=lambda t: t[1], reverse=True)

print(sum_score)


# 面向函数编程（高阶函数）
# 以函数作为参数
def fun(f):
    # 调用传进来的函数
    s = f(100)
    print(s)


fun(lambda i: i ** 3)


# 自定义sort函数
# 在函数封装过程中，可以将一段改变的代码逻辑抽象出来，作为参数传递给函数
def sort(data, key):
    # 获取列表的长度
    n = len(data)
    # 外层循环每一个确定一个元素
    for i in range(n - 1):
        # 内层循环比较两个相邻的元素，如果前面的大于后面的，交换位置
        for j in range(n - (i + 1)):
            # 如果前面的大于后面的，交换位置
            if key(data[j]) > key(data[j + 1]):
                # 交换位置
                data[j], data[j + 1] = data[j + 1], data[j]
    return data


l = [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 3, 3]
print(sort(sum_score, key=lambda t: t[1]))


ages = ["张三,23", "李四,22", "王五,24", "赵六,26"]
print(sort(ages, key=lambda s: int(s.split(",")[1])))
